import copy  # 导入复制模块
import numpy as np  # 导入numpy库

import torch  # 导入PyTorch
import torch.nn as nn  # 导入PyTorch神经网络模块

def init(module, weight_init, bias_init, gain=1):
    """
    初始化神经网络模块的权重和偏置
    
    参数:
        module: 要初始化的神经网络模块
        weight_init: 权重初始化函数
        bias_init: 偏置初始化函数
        gain: 增益参数，用于缩放权重
        
    返回:
        初始化后的模块
    """
    weight_init(module.weight.data, gain=gain)  # 初始化权重
    bias_init(module.bias.data)  # 初始化偏置
    return module

def get_clones(module, N):
    """
    创建模块的N个深度复制
    
    参数:
        module: 要复制的模块
        N: 复制的数量
        
    返回:
        包含N个模块副本的ModuleList
    """
    return nn.ModuleList([copy.deepcopy(module) for i in range(N)])

def check(input):
    """
    检查输入并将numpy数组转换为PyTorch张量
    
    参数:
        input: 输入数据，可以是numpy数组或PyTorch张量
        
    返回:
        PyTorch张量形式的输入
    """
    output = torch.from_numpy(input) if type(input) == np.ndarray else input
    return output
